# 切片:按照规则获取字符串中一部分元素的方法叫做切片
# 切片格式:[起始位置： 结束位置： 步长]
# 起始位置: 切片开始位置的下标[包含]
# 结束位置: 切片结束位置的下标[不包含]
# 步长: 获取数据的间隔(后一个索引,减去前一个索引)

# 创建一个字符串
str1 = 'abcdef'
'''
a   b   c   d   e   f
0   1   2   3   4   5 
-6 -5  -4  -3  -2  -1
'''
# 正数步长
# 需求: 获取abc
# TODO 切片格式:[起始位置： 结束位置： 步长]
print(str1[0:3:1])  # abc  从下标为0的位置开始截取,到下标为3的位置终止,不包含3, 依次获取每一个元素
print(str1[-6:-3:1])  # abc  切片可以使用负数下标

# TODO 思考: 如果切片的范围查出索引范围会怎样?
# TODO 不会报错,如果切片范围超出则只保留能够获取的数据,如果切片范围不存在,任何数据则返回空字符串
print(str1[0:25:1])  # abcdef
print(str1[23:25:1])  # 空字符串

# 需求: 获取bdf
print(str1[1:6:2])  # bdf  因为我们需要包含最后一个元素,所以我们使用最有一个元素的下标+1作为结束索引

# TODO 思考: 如果进行了切片,原数据会不会发生改变呢? 不会改变,切片会产生新的字符串,原字符串不变
print(str1)  # abcdef

str2 = str1[1:4:1]
print(str2)  # bcd

# 负数步长
# 当步长为负数时,我们获取数据的顺序不再是从左至右,而是从右至左
# 需求: 获取edc
# print(str1[2:5:-1]) # 空字符串  因为起始位置为2 结束位置为5 步长为-1时从右至左依次取值,该区间没有任何数据
print(str1[4:1:-1])  # edc

# 需求: 获取fdb
print(str1[5:0:-2])  # fdb

# 注意:
# 我们开发中一般都使用正数索引,负数索引了解即可.  如果需要逆向取值,可以先正向取然后逆转容器元素.

# TODO 负数步长最常用的应用场景 进行容器逆转:  [::-1]

str3 = str1[::-1]
print(str3)  # fedcba  字符串反转方法

# 练习:
str4 = '春种一粒粟,秋收万颗子.'

# 需求:  获取 一粒粟
print(str4[2:5:1])  # 一粒粟

# 需求:  获取 春一栗
print(str4[0:5:2])  # 春一粟

# 需求:  获取 子颗万
print(str4[-2:-5:-1])  # 子颗万

# 需求:  将整个字符串反转
print(str4[::-1])  # .子颗万收秋,粟粒一种春
